﻿// Copyright (c) 2012 - 2020 Jared Zheng <jaredz at outlook dot com>
// Buddha Framework is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
//          http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
//
// Create : 2012-12-01 version 0.1 Jared Zheng <jaredz at outlook dot com>
// Update : 2018-12-05 version 3.1.5 Jared Zheng <jaredz at outlook dot com>

#ifndef __SERVER_SORT_H__
#define __SERVER_SORT_H__

#pragma once

#include "datadef.h"

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 快速排序服务器负载情况
struct tagQUICK_SORT : public tagSERVER_SORT
{
public:
    static void QuickSort(tagSERVER_SORT* pSort, Int nCount);
    static void QuickSortRecursion(tagSERVER_SORT* pSort, Int nBegin, Int nEnd);
    static Int  Partition(tagSERVER_SORT* pSort, Int nBegin, Int nEnd);
public:
    tagQUICK_SORT(void);
    ~tagQUICK_SORT(void);
};
typedef struct tagQUICK_SORT   QUICK_SORT, *PQUICK_SORT;
///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 服务器按负载情况排序结果数组
struct tagSORT_RESULT : public MObject
{
public:
    tagSORT_RESULT(void);
    ~tagSORT_RESULT(void);
    /// 重置数据
    void   Reset(void);
    void   Count(UInt uAddCount);
    /// 获取排序结果最小负载的服务器索引号
    UInt   Index(void);
    UInt   Find(ULLong ullKey);
    /// 获取排序结果最大负载
    UShort MaxLoad(void);
public:
    UInt                  uIndex; ///< 最后更新的索引号
    UInt                  uCount; ///< 排序结果总数
    CTArray<QUICK_SORT>   Sort;   ///< 排序结果数组
};
typedef struct tagSORT_RESULT   SORT_RESULT, *PSORT_RESULT;
///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 服务器按负载情况排序结果数组交换链
struct tagRESULT_CHAIN : public MObject
{
public:
    tagRESULT_CHAIN(void);
    ~tagRESULT_CHAIN(void);
    /// 重置数据
    void Reset(void);
    /// 切换数组
    void Swap(void);
    /// 获取当前使用的数组
    SORT_RESULT& GetCur(void);
    /// 获取后备数组
    SORT_RESULT& GetNext(void);
public:
    UInt          uIndex;    ///< 当前使用的数组索引号
    SORT_RESULT   Result[2]; ///< 交换数组
};
typedef struct tagRESULT_CHAIN   RESULT_CHAIN, *PRESULT_CHAIN;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "serversort.inl"

#endif // __SERVER_SORT_H__
